/********************************************************************************
 * Project Name		[JavaEE_Web]
 * File Name     	[JSP07.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package _notes.jsp;

/**
 * JSTL(Java Server Pages Standard Tag Library)
 * 
 * Core Tag Library
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public final class JSP07 {

	public void coreTaglib() {
		/**
		 * 核心标签库<br/>
		 * 
		 * <code>
		 * <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
		 * </code><br/>
		 */
	}

	public void cout() {
		/**
		 * <c:out>用来显示数据的内容, 就像是 <%=...%> 一样<br/>
		 * 
		 * <code>
		 * <c:out value="${param.name}" [escapeXml="true|false"] [default="defaultValue"]/>
		 * <c:out value="${param.name}" [escapeXml="true|false"]>defaultValue</c:out/>
		 * </code><br/>
		 * 
		 * 属性<br/>
		 * value: 需要输出的值, 必选<br/>
		 * default: 如果value为null, 则显示default的值, 可选<br/>
		 * escapeXml: 是否转换特殊字符, 如 < 转换为&lt;, 可选, 默认值true<br/>
		 * 
		 * 注意<br/>
		 * 默认会将 [< > ' " &] 转换为[&lt; &gt; &#039; &#034 &amp;] <br/>
		 * 不想转换只需要设定<c:out>的escapeXml属性为 false就可以了<br/>
		 * null值会被转换为""<br/>
		 */
	}

	public void cset() {
		/**
		 * <c:set>用来将变量存储至JSP四种属性范围或JavaBean中<br/>
		 * 
		 * <code>
		 * <!-- 将${param.name}的值设置到 attrName变量中 -->
		 * <c:set value="${param.name}" var="attrName" [scope="page|request|session|application"] />
		 * <c:set var="attrName" [scope="page|request|session|application"]>${param.name}</c:set>
		 * 
		 * <!-- 将${param.name}的值设置到object对象的propertyName属性中 -->
		 * <c:set value="${param.name}" target="${object}" property="propertyName" />
		 * <c:set target="${object}" property="propertyName">${param.name}</c:set>
		 * </code>
		 * 
		 * 属性<br/>
		 * value: 要被设置的值, 可选<br/>
		 * var: 欲存入的变量名称, 可选<br/>
		 * scope: var变量的JSP范围, 可选, 默认值page<br/>
		 * target: 为一个JavaBean或java.util.Map对象, 可选<br/>
		 * property: 指定target对象的属性, 可选<br/>
		 * 
		 * 注意<br/>
		 * 当为JavaBean或Map设值时, 如果target为null或不是JavaBean或Map对象, 则产生异常<br/>
		 * 当value值为null时<br/>
		 * 1. 定义在scope中的var将被移除<br/>
		 * 2. 若target为JavaBean, property指定的属性值设为null<br/>
		 * 3. 若target为Map, 则相当于调用Map.remove(propertyName)删除元素<br/>
		 */
	}

	public void cremove() {
		/**
		 * <c:remove>用来移除变量<br/>
		 *
		 * <code>
		 * <c:remove var="varName" [scope="page|request|session|application"] />
		 * </code><br/>
		 * 
		 * 属性<br/>
		 * var: 欲移除的变量名称, 必选<br/>
		 * scope: var变量的JSP范围, 可选, 默认值page<br/>
		 * 
		 * 注意<br/>
		 * 不设定scope时会依次从page|request|session|application中查找, 找到则移除, 找不到不做任何操作
		 * <br/>
		 */
	}

	public void ccatch() {
		/**
		 * <c:catch>用来处理异常并将异常信息保存起来<br/>
		 * 
		 * <code>
		 * <c:catch [var="varName"]>错误出现处</c:catch>
		 * </code><br/>
		 * 
		 * 属性<br/>
		 * var: 用来储存错误信息的变量, 可选<br/>
		 * 
		 * 注意<br/>
		 * 当错误发生在<c:catch>和</c:catch>之间时, 则只有<c:catch>和</c:catch>之间的程序会被中止忽略,
		 * 但整个网页不会被中止<br/>
		 */
	}

	public void cif() {
		/**
		 * <c:if>和Java的if语句功能相同<br/>
		 * 
		 * <code>
		 * <c:if test="condition" [var="varName"] [scope="page|request|session|application"] />
		 * <c:if test="condition" [var="varName"] [scope="page|request|session|application"]>标签体内容</c:if>
		 * </code><br/>
		 * 
		 * 属性<br/>
		 * test: 如果表达式结果为true, 则执行标签体内容, 必选<br/>
		 * var: 用来存储test运算后的结果[true|false], 可选<br/>
		 * scope: var变量的JSP范围, 可选, 默认值page<br/>
		 * 
		 * 注意<br/>
		 * <c:if>的标签体内容除了能放纯文字, 还可以放任何JSP程序代码[Scriptlet], JSP标签或者Html代码<br/>
		 */
	}

	public void cchooseWhenOtherwise() {
		/**
		 * <c:choose>本身只能作为<c:when>和<c:otherwise>的父标签<br/>
		 * 
		 * 注意<br/>
		 * <c:choose>的标签体内容只能是<br/>
		 * 1. 空白<br/>
		 * 2. 1或多个<c:when><br/>
		 * 3. 0或多个<c:otherwise><br/>
		 * 
		 * <c:when>必须为<c:choose>的子标签<br/>
		 * <c:otherwise>必须为<c:choose>的子标签<br/>
		 * 
		 * <code>
		 * <c:choose>
		 *     <c:when test="condition1">标签体内容</c:when>
		 *     <c:when test="condition2">标签体内容</c:when>
		 *     <c:otherwise>标签体内容</c:otherwise>
		 * </c:choose>
		 * </code><br/>
		 * 
		 * 注意<br/>
		 * 在同一个<c:choose>中时, <c:when>必须在<c:otherwise>之前, <c:otherwise>必须是最后一个标签
		 * <br/>
		 * <c:when>必须有test属性<br/>
		 */
	}

	public void cforEach() {
		/**
		 * <c:foreEach>循环控制<br/>
		 * 
		 * <code>
		 * <c:forEach [var="varName"] items="Collection" [varStatus="status"] [begin="beginIdex"] [end="endIndex"] [step="step"]>标签体内容</c:forEach>
		 * <c:forEach [var="varName"] [varStatus="status"] begin="beginIdex" end="endIndex" [step="step"]>标签体内容</c:forEach>
		 * </code><br/>
		 * 
		 * 属性<br/>
		 * var: 用来存放现在指到的成员, 可选, 字符串类型<br/>
		 * items: 被迭代的对象, 可选, 可以是[数组|Collection|Iterator|Enumeration|Map|String]
		 * <br/>
		 * varStatus: 用来存放现在指到的相关成员信息, 可选, 字符串类型, 有四个属性<br/>
		 * 1. index number类型, 现在指到成员的索引<br/>
		 * 2. count number类型, 总共指到成员的总数<br/>
		 * 3. first boolean类型, 现在指到的成员是否为第一个成员<br/>
		 * 4. last boolean类型, 现在指到的成员是否为最后一个成员<br/>
		 * begin: 开始的位置, 可选, int类型, 默认值为0<br/>
		 * end: 结束的位置, 可选, int类型, 最后一个成员<br/>
		 * step: 每次迭代的间隔数, 可选, int类型, 默认值为1<br/>
		 * 
		 * 注意<br/>
		 * 假若有begin属性, begin必须大于等于0<br/>
		 * 假若begin小于end, 但是二者都超过items的length或size时, 输出为空<br/>
		 * 假若有end属性, 必须大于begin, 若end小于begin, 则会输出空<br/>
		 * 假若只有end超过items的length或size时, 输出结果和无设定end的情况相同<br/>
		 * 假若有step属性, step必须大于等于0<br/>
		 * 假若begin大于或等于items的length或size时, 迭代不运算<br/>
		 * 假若items为null, 则表示为空的集合对象<br/>
		 */
	}

	public void cforTokens() {
		/**
		 * <c:forTokens>用来浏览字符串中所有的成员, 其成员是由定义符号[delimiters]所分隔的<br/>
		 * 
		 * <code>
		 * <c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"][varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>标签体内容</c:forTokens>
		 * </code><br/>
		 * 
		 * 属性<br/>
		 * var: 用来存放现在指到的成员, 可选<br/>
		 * items: 被迭代的字符串, 必选<br/>
		 * delims: 第一用来字符串的分隔符, 必选<br/>
		 * varStatus: 同<c:forEach><br/>
		 * begin: 同<c:forEach><br/>
		 * end: 同<c:forEach><br/>
		 * step: 同<c:forEach><br/>
		 * 
		 * 注意<br/>
		 * 同<c:forEach>注意事项<br/>
		 * 
		 * <c:forEach>可以分割分隔符为,的字符串<br/>
		 */
	}

	public void cimport() {
		/**
		 * <c:import>可以把其他静态或动态文件包含至本JSP页面<br/>
		 * 
		 * <code>
		 * <c:import url="url" [context="context"] [var="varName"] [scope="page|request|session|application"] [charEncoding="encoding"]>标签体内容</c:import>
		 * <c:import url="url" [context="context"] [varReader="varReaderName"] [charEncoding="charEncoding"]>标签体内容</c:import>
		 * </code><br/>
		 * 
		 * 属性<br/>
		 * url: 被导入内容的URL, 必选<br/>
		 * context: 被导入内容所在的WebApp, 相同服务器下, 其他WebApp必须以/开头, 可选<br/>
		 * var: 储存被导入的内容[以String类型存入], 可选<br/>
		 * scope: var变量的JSP范围<br/>
		 * charEncoding: 被导入内容的编码格式, 可选<br/>
		 * varReader: 储存被导入的内容[以Reader类型读入], 可选<br/>
		 * 
		 * 注意<br/>
		 * 假若url为null或空时, 会产生 JspException<br/>
		 * 当var属性存在时, 虽然同样会把其他文件的内容包含进来, 但是并不会输出至网页上, 而是以String的类型储存至varName中
		 * <br/>
		 * <c:import>的标签体中可以使用<c:param>, 其可以将参数传递给被包含的文件, 其有两个属性[name和 value]
		 * <br/>
		 * 若包含其他的WebApp内容, 则被包含文件的WebApp必须在server.xml中定义过, 且
		 * <Context>的crossContext属性值必须为true<br/>
		 * 
		 * 和<jsp:include>的区别<br/>
		 * <jsp:include>只能包含和自己同一个webApplication下的文件<br/>
		 * 而<c:import>可以包含和自己同一个webApplication的文件外,
		 * 也可以包含不同webApplication或者是其他网站的文件 <br/>
		 */
	}

	public void curl() {
		/**
		 * <c:url>主要用来产生一个 URL<br/>
		 * 
		 * <code>
		 * <c:url value="URL" [context="context"] [var="varName"][scope="{page|request|session|application}"] />
		 * <c:url value="URL" [context="context"] [var="varName"][scope="{page|request|session|application}"]>
		 *     <c:param name="paramName" value="paramValue" />
		 * </c:url>
		 * </code><br/>
		 * 
		 * 属性<br/>
		 * value: 执行的URL, 必选<br/>
		 * context: 执行的URL所在的WebApp, 相同服务器下, 其他WebApp必须以/开头, 可选<br/>
		 * var: 储存执行的的URL[以String类型存入], 可选<br/>
		 * scope: var变量的JSP范围, 可选<br/>
		 * 
		 * 注意<br/>
		 * 标签体内容使用<c:param>作为查询字符串参数<br/>
		 * 当var属性存在时, 虽然同样会把URL包含进来, 但是并不会直接输出URL<br/>
		 * <c:url>标签会自动进行URL重写并对<c:param>参数进行编码<br/>
		 */
	}

	public void credirect() {
		/**
		 * <c:redirect>将客户端的请求从一个JSP页面导向到其他文件<br/>
		 * 
		 * <code>
		 * <c:redirect url="url" [context="context"] />
		 * <c:redirect url="url" [context="context"] > 
		 *     <c:param name="paramName" value="paramValue" /> 
		 * </c:redirect >
		 * </code><br/>
		 * 
		 * 属性<br/>
		 * url: 转向的URL, 必选<br/>
		 * context: 被包含的WebApp, 相同服务器下, 其他WebApp必须以/开头, 可选<br/>
		 */
	}
}
